﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Windows.Forms;
using kk.components.contracts;
using kk.components.contracts.ServiceContract;
using kk.kinokasseserviceproxy;
using kk.kinokasseservicestub;

namespace kk.host
{
    static class Program
    {
        /// <summary>
        /// The main entry point for the application.
        /// </summary>
        [STAThread]
        static void Main()
        {
            Application.EnableVisualStyles();
            Application.SetCompatibleTextRenderingDefault(false);

            // Build
            IBelegungsplanAnsicht belegungsplanansicht = new kk.belegungsplanansicht.usercontrol.CtlBelegungsplanAnsicht();
            IReservierungsrahmen reservierungsrahmen = new kk.reservierungsrahmen.form.FrmCouchPotato((Control)belegungsplanansicht);

            IBelegungsplanFactory belegungsplanfactory = new kk.belegungsplanfactory.BelegungsplanFactory();
            ISaalbestuhlungsAdapter saalbestuhlungsplanadapter = new kk.saalbestuhlungsadapter.SaalbestuhlungsAdapter();
            IPreiskategorieAdapter preiskategorieadapter = new kk.preiskategorieadapter.PreiskategorieAdapter();

            using (IBelegungsAdapter belegungsadapter = new kk.belegungsadapter.BelegungsAdapter())
            using(IKinokasseServiceProxy serviceProxy = new KinokasseServiceProxyInSpace())
            using(IKinokasseServiceStub serviceStub = new KinokasseServiceStubInSpace())
            {
                // Bind
                reservierungsrahmen.OnBelegungsplanZuVorstellung += serviceProxy.ProcessBelegungsplanZuVorstellung;
                reservierungsrahmen.OnBelegungsplan += belegungsplanansicht.ProcessBelegungsplan;
                reservierungsrahmen.OnReservierungsanfrage += serviceProxy.ProcessReservierungsanfrage;

                belegungsplanansicht.OnGeändertePlatzwahl += reservierungsrahmen.ProcessGeändertePlatzwahl;

                serviceStub.OnBelegungsplanZuVorstellung += belegungsplanfactory.ProcessBelegungsplanZuVorstellung;
                serviceStub.OnReservierungsanfrage += belegungsadapter.ProcessReservierungsanfrage;

                belegungsplanfactory.OnBestuhlungZuSaalplan += saalbestuhlungsplanadapter.ProcessBestuhlungZuSaal;
                belegungsplanfactory.OnPreiskategorien += preiskategorieadapter.ProcessPreiskategorien;
                belegungsplanfactory.OnBelegungenZuVorstellung += belegungsadapter.ProcessBelegungenZuVorstellung;

                // Configure
                serviceStub.Configure("tcp.port=8000");
                serviceProxy.Configure("tcp.port=0", "localhost:8000");
                reservierungsrahmen.Configure(); // muss als letzte config aufgerufen werden, weil darin auf andere komponenten zugegriffen wird

                // Run
                Application.Run((Form) reservierungsrahmen);
            }
        }
    }
}
